<template>
	<view class="content">
		<!-- u-list用法参考文档：https://www.uviewui.com/components/list.html -->
		<u-list @scrolltolower="scrolltolower">
			<u-list-item v-for="(task, index) in tasks" :key="index">
				<view class="item" @click="showDetail(task.title, task.content, index)">
					<u-checkbox-group>
						<u-checkbox :size="20" @change="onTaskChange(task._id)" :checked="task.status == 1"></u-checkbox>
					</u-checkbox-group>
					<text :style="task.status == 1 ? 'text-decoration: line-through':''">{{task.title}}</text>
				</view>
			</u-list-item>
		</u-list>
		
		<!-- u-modal用法参考文档：https://www.uviewui.com/components/modal.html -->
		<u-modal :show="show" :title="showTitle" 
			:content="showContent" :showCancelButton="true" 
			cancelText="删除" cancelColor="#FF0000" @confirm="show = false" @cancel="delTask" >
		</u-modal>
	</view>
</template>

<script>
	export default {
		// data方法return {} 大括号里是定义当前页面要使用的变量
		// 在<script>中直接this.就可以访问如：this.show 、this.show = true
		// <template> 下标签属性中使用要在属性名前加冒号如： <u-modal>中的 :show="show"
		// 非标签属性就要用{{}}两个大括号包起来，如上面的<text>标签里的 {{task.title}}
		data() {
			return {
				show: false,
				showTitle: '',
				showContent: '',
				currentIndex: null,			
				tasks: []
			}
		},
		
		// onLoad方法是当页面加载时触发
		onLoad() {
			// 执行加载数据方法，方法定义都在下面的methods属性内
			this.loadTask()
		},
		
		// onShow方法是当这个页面显示时会被触发
		onShow() {
			// 同上
			this.loadTask()
		},
		
		methods: {
			// 加载任务列表
			loadTask() {
				// 调用云函数，就是上面uniCloud上创建的
				// name 就是云函数的名称
				// data下的 action 就是告诉后端当前是什么操作
				// 获取远程数据库中的任务数据
				uniCloud.callFunction({
					name: 'task',
					data: {
						action: 'list'
					},
					success: (e) => {
						// e是后台混函数返回的数据
						// 其中任务列表数据放在了e的result属性下
						this.tasks = e.result
					}
				})
			},
			
			// 监听checkbox组件的状态变化，当勾上或去掉勾就会调用该方法
			// 上面<u-checkbox>中使用 @change="onTaskChange(task._id)"
			// 将任务id传过来
			onTaskChange(id) {
				this.changeState(id);
			},
			// 更新id对应的任务状态值
			changeState(id) {
				// filter map 方法可以参考：https://juejin.cn/post/6844903807176933384
				// 或自行百度搜索：js数组 filter map
				this.tasks.filter(task => task._id == id).map(task => {
					// 使用三目运算符修改状态，说白了就是原来如果是1就改为0，反之亦然。
					task.status = task.status == 1 ? 0 : 1;
					// 调用云函数修改远程数据库中的数据
					uniCloud.callFunction({
						name: 'task',
						data: {
							action: 'update',
							_id: id,  // 要修改的数据的id是多少
							status: task.status // 要将改id对应的数据status值改为
						}
					})
				})
			},
			
			// 删除任务
			delTask() {
				// 如果没有打开当前任务则返回，不往下执行
				if(this.currentIndex == null) {
					return;
				}
				// 调用云函数，删除远程数据库中对应id的数据
				uniCloud.callFunction({
					name: 'task',
					data: {
						action: 'delete',
						_id: this.tasks[this.currentIndex]._id
					},
					success: () => {
						// 服务端修改成功后
						// 关闭前端的弹窗
						this.show = false
						// 从前端任务列表中删除对应的这条任务
						this.tasks.splice(this.currentIndex, 1)
					}
				})
			},

			// 任务详情弹窗
			// 需要接收任务标题，任务内容，任务所在列表的下标
			showDetail(title, content, index) {
				this.currentIndex = index
				this.show = true
				this.showTitle = title
				this.showContent = content
			},
		},
		
		// 该方法是监听导航栏右上角按钮
		onNavigationBarButtonTap(e) {
			// 如果按的是加号按钮
			if (e.text == '+') {
				// 跳转到页面 /pages/add/add
				uni.navigateTo({
					url: "/pages/add/add"
				})
			}
		}
	}
</script>

<style>
	.content {
		text-overflow: ellipsis;
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	.item {
		display: flex;
		flex-direction: row;
		align-items: center;
		padding: 0 20px;
		height: 44px;
		border-bottom: 1px solid #CCC;
		font-size: 36rpx;
	}
</style>
